# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import csv
import hashlib
import json
import os

from itemadapter import ItemAdapter
from redis import StrictRedis
from scrapy.exceptions import DropItem


# class CheckExist:
#     def open_spider(self, spider):
#         self.redis_client = StrictRedis(host='localhost', port=6379, db=0)
#
#     def close_spider(self, spider):
#         self.redis_client.close()
#
#     def process_item(self, item, spider):
#         # 目的：判断当前要处理的item数据是否已经在Redis中存在，如果存在那么就扔掉，如果不存在则传递给下一个权重低的process_item
#
#         item_str = json.dumps(item)
#         md5 = hashlib.md5()
#         md5.update(item_str.encode())
#         hash_val = md5.hexdigest()  # 例如 b7c114800d29dce2ef9608a04792baa5
#         # 到Redis中找是否存在这个item对应的哈希值
#         if self.redis_client.get(hash_val):
#             # 如果找到了....扔掉
#             raise DropItem("---此数据在Redis中查询到了---没有必要再次存储....")
#         else:
#             # 没找到....存储到Redis，传递给下一个权限低的process_item
#             self.redis_client.set(hash_val, item_str)
#
#         return item


class CheckData:
    def process_item(self, item, spider):
        # 目的：实现数据的校验（清洗数据）
        print("-----清洗管道被调用----")
        # 提取规格
        specs = item.get("specs")
        # 判断是否符合要求
        if specs.find("\\") != -1 or specs.find("|") != -1 or specs.find("/") != -1:
            # 不符合要求，此时对数据进行修复
            item["specs"] = specs.replace("\\", "")
            item["specs"] = item["specs"].replace("|", "、")
            item["specs"] = item["specs"].replace("/", "、")

        return item


class Xinfadi1Pipeline:

    def process_item(self, item, spider):
        print("----管道被调用----")
        # 判断是否存在download文件夹，如果没有则创建
        download_path = os.getcwd() + '/download/'  # 当前文件夹下的download文件夹
        if not os.path.exists(download_path):  # 判断文件夹或文件
            os.makedirs(download_path)
        # 如果是信息，就保存到csv文件
        with open(download_path + '新发地.csv', 'a') as f:
            # 创建一个csv的DictWriter对象，这样才能够将写入csv格式数据到这个文件
            f_csv = csv.DictWriter(f, ['title', 'price_low', 'price_average', 'price_high', 'specs', 'unit',
                                       'publish_date'])
            # 写入多行行（当做数据）
            f_csv.writerows([item])
            print("保存信息到CSV....ok")
        return item
